package com.qf.talk.controller;

import com.alibaba.fastjson.JSONObject;
import com.qf.base.controller.BaseController;
import com.qf.base.dto.push.MessageDTO;
import com.qf.base.result.R;
import com.qf.base.utils.SnowFlakeUtil;
import com.qf.base.vo.UserVo;
import com.qf.talk.client.PushClient;
import com.qf.talk.dto.AddFriendDTO;
import com.qf.talk.dto.AskForDTO;
import com.qf.talk.dto.PolicyDTO;
import com.qf.talk.dto.RequestDTO;
import com.qf.talk.service.FriendService;
import com.qf.talk.vo.PolicyVO;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author 30909
 */
@RestController
@RequestMapping("qf/friend")
public class FriendController extends BaseController {

    @Resource
    private FriendService friendService;

    @Resource
    private SnowFlakeUtil snowFlakeUtil;
    @Resource
    private PushClient pushClient;

    /**
     * 数据从何而来?
     * 开通好友服务的接口
     * 此接口，把token解析为 uid
     * uid 加入到friend_base 数据库中
     *
     * @return
     */
    @PostMapping("start")
    public R start() {
        //拿到用户当前登录的uid
        Long userId = userId();
        //调用 service 注册 userId 为好友一个实体
        int result = friendService.addFriendBase(userId);
        // if{} else{} 语句 比我之前的直接if 判断更专业一些
        if (result > 0) {
            return R.ok("开通服务成功");
        } else {
            return R.error("开通好友服务失败");
        }
    }


    /**
     * 展示好友策略
     */
    @GetMapping("policies")
    public R showPolicies() {
        List<PolicyVO> policyVOS = friendService.selectPolicies();
        return R.ok("查询成功").setResult("policies", policyVOS);
    }


    /**
     * 修改添加好友策略
     */
    @GetMapping("policy")
    public R setPolicy(@RequestBody PolicyDTO policyDTO) {
        Long userId = userId();
        Integer id = policyDTO.getId();
        String question = policyDTO.getQuestion();
        String answer = policyDTO.getAnswer();
        String password = policyDTO.getPassword();
        //修改数据库
        int result = friendService.updatePolicyById(userId, id, question, answer, password);
        if (result > 0) {
            return R.ok("修改成功");
        } else {
            return R.error("修改失败");

        }

    }


    /**
     * 添加好友的方法
     * 以张三加李四好友为例
     */
    @PostMapping("add")
    public R addFriend(@RequestBody AddFriendDTO addFriendDTO) {
        Long userId = userId();
        Long groupId = addFriendDTO.getGroupId();
        String message = addFriendDTO.getMessage();
        Long wantId = addFriendDTO.getWantId();

        int result = friendService.addFriend(userId, wantId, message, groupId);
        if (result == 0) {
            //添加失败
            return R.error(501, "添加失败");
        } else if (result == 1) {
            //添加成功

            //调用推送
            MessageDTO messageDTO = new MessageDTO();
            JSONObject msg = new JSONObject();
            msg.put("user", user());
            msg.put("message", user().getNickname() + "已经添加你为好友");
            messageDTO.setMessage(msg.toJSONString());
            messageDTO.setServiceId(2);
            messageDTO.setRequestId(snowFlakeUtil.nextId());
            // 怎么写?
            messageDTO.setUid(wantId);
            pushClient.sendWeb(messageDTO);
            return R.ok(200, "添加成功");
        } else if (result == 2) {
            //等待对方对方同意知道有人要添加她为好友

            //让他处理
            MessageDTO messageDTO = new MessageDTO();
            messageDTO.setUid(wantId);
            messageDTO.setServiceId(2);
            JSONObject msg = new JSONObject();
            msg.put("meassage", user().getNickname() + "请求加你为好友");
            msg.put("user", user());
            msg.put("requestMsg", message);
            messageDTO.setMessage(msg.toJSONString());
            messageDTO.setRequestId(snowFlakeUtil.nextId());
            pushClient.sendWeb(messageDTO);
            return R.ok(201, "钱家亲戚已经发送");

        } else {
            return R.error("未知异常");
        }

    }


    //TODO 答复好友的接口

    /**
     * 答复好友的接口
     */
    @PostMapping("askFor")
    public R askFor(@RequestBody AskForDTO askForDTO) {
        Long id = askForDTO.getId();
        Long groupId = askForDTO.getGroupId();
        Integer state = askForDTO.getState();


        // 因为 service 里有 添加好友管的方法
        Long userId = friendService.askRequest(id,state,userId(),groupId);

        // controller 做推送
        MessageDTO messageDTO = new MessageDTO();
        messageDTO.setUid(userId);
        messageDTO.setRequestId(snowFlakeUtil.nextId());
        messageDTO.setServiceId(2);
        JSONObject msg = new JSONObject();
        UserVo user = user();

        //发给添加人，被添加人（答复人）的个人信息
        msg.put("user", user);
        if (state==1){
            msg.put("message",user().getNickname()+"已经同意你的添加请求");
        }else {
            msg.put("message",user().getNickname()+"拒绝你的添加请求");
        }

        messageDTO.setMessage(msg.toJSONString());
        pushClient.sendWeb(messageDTO);

        return R.ok("操作成功!");
    }



    /**
     * 查询一个用户所有请求的接口
     *  分页有 bug
     */
    @PostMapping("request")
    public R findRequest(@RequestBody RequestDTO requestDTO){
        Long userID = userId();
        Integer lastItemId = requestDTO.getLastItemId();
        Integer pageSize = requestDTO.getPageSize();
        friendService
    }


    //TODO 查询所有分组
    /**
     * 查询所有分组
     */


    //TODO 创建一个分组
    /**
     * 创建一个分组
     */


    //TODO 给好友设置备注信息
    /**给好友设置备注信息
     *
     */

    //TODO 修改组的名称
    /**
     * 修改组的名称
     */


    //TODO 删除一个分组
    /**
     *
     */


    //TODO 查询好友所有的好友（展示好友列表）
    /**
     *  ***** 难度五星
     *  查询好友所有的好友（展示好友列表）
     */

}
